【函数式编程】什么是函数式编程? C语言为何不是函数式语言?

您所在的位置:网站首页 函数式编程 c语言 【函数式编程】什么是函数式编程? C语言为何不是函数式语言?

【函数式编程】什么是函数式编程? C语言为何不是函数式语言?

2023-06-10 21:23| 来源: 网络整理| 查看: 265

什么是函数式编程? C语言为何不是函数式语言?

函数式语言有两个主要的特点:1. 函数是“头等公民”。2. 数据的“immutability”(不变;永恒性;不变性;). 操作的“无副作用”,

这规避了‘锁’。

函数式编程的函数是指数学上的函数:给定输入固定的输出,没有副作用。任何语言都可以用函数式的风格,

只是难易不同罢了。

比如有函数 y = f(x). 和 函数 x = g(z); 可以组成复合函数 y=f(g(z));

对于第二个问题,C为何不是函数式语言?

因为这种效果在C里面不能实现: y=f(g(z));

int f(int x) { print x;} ===== y = f(x)int g(int z) {return z;} ===== x = g(z)int f1(int (*g)(int)) { print g(z);} ===== y = f1(g(z))

从上面的函数定义可以看到,当函数f(x)的参数定义为int时,便不能将函数g(z)作为形参传递给它。(函数指针与int参数类型不匹配)

反过来看函数f1()也不能接受int作为参数了。

于是,C达不到数学上函数的那种效果。

而在clojure里面却可以。

(defn f [x] (print x)) ======= y = f(x)(defn g [z] z) ======= t = g(z)

这时,(f (g 3)) 和 (f 3) 的结果是一样的,达到了数学上的效果。

再者,C也不具有函数式语言的特点2.

常见的函数式语言有哪些?

coljure、scala、Haskell。

为什么如python/javascrip这些语言不是函数式语言呢,因为他们不具备函数式语言的特点2.

————————————————

 

毫无干货的带你理解什么是函数式编程

 

世界模型

如果让你搭建一个模型来描述这个世界你会怎么做?

面向对象

​​面向对象​​之父​​Alan Kay​​给我们带来了一种抽象化世界的方法。

一切事物皆对象,通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、​​继承​​,帮助人们实现对现实世界的​​抽象​​与数字建模。

因此我们有了面向对象式的编程式范。

函数式

这里本来应该引入​​《范畴论》​​的概念,不过在这里引入似乎会把事情搞的更复杂,所以先不去理会它,直接看结果。

世界就是由事物和事物之间的关系构成的

下面是一个空无一物的世界:

 

【函数式编程】什么是函数式编程? C语言为何不是函数式语言?_函数式

image.png

世界中有一个​​a​​:

【函数式编程】什么是函数式编程? C语言为何不是函数式语言?_函数编程_02

image.png

 

世界中有了事物​​a​​和​​b​​,还有他们之间的关系​​f​​,即使他们之间没关系也可以用​​f​​来表示,只不过​​f​​等于​​null​​。

【函数式编程】什么是函数式编程? C语言为何不是函数式语言?_函数式编程_03

image.png

 

我们的世界更加丰富了:

【函数式编程】什么是函数式编程? C语言为何不是函数式语言?_函数式编程_04

image.png

如果我们继续这样画下去我们可以画出一个足够复杂的世界。不过到这里已经足够了。

把关系​​f​​作用到​​a​​上可以得到​​b​​ 把关系​​g​​作用到​​b​​上可以得到​​c​​ 把关系​​h​​作用到​​a​​上可以得到​​c​​ 其中​​h = g.f​​

让我们再次进行抽象,抽取他们的共性部分。

 

【函数式编程】什么是函数式编程? C语言为何不是函数式语言?_面向对象_05

image.png

所以我们得到了一个结构:​​a​​表示事物,​​f​​表示关系。把​​f​​作用到​​a​​上我们就可以得到​​b​​。

【函数式编程】什么是函数式编程? C语言为何不是函数式语言?_函数编程_06

image.png

 

要知道一切真理都是包含在特定的​​上下文​​中的(除了这一句)。所以我们的事物​​a​​也应该包含在上下文中它才是真正的​​a​​,所以我们得到的​​b​​也是上下文中的​​b​​。

【函数式编程】什么是函数式编程? C语言为何不是函数式语言?_面向对象_07

image.png

(这张图看起来像是​​a​​是印在盒子上的而不是在盒子内部,不要在意这些细节它是在盒子里的)

我们来用一个算式来验证一下模型计算​​1+2+4​​的值:

【函数式编程】什么是函数式编程? C语言为何不是函数式语言?_函数式编程_08

image.png

 

我们再来一个用户登录的模型,用户名和密码长度都大于​​0​​的时候才可以登录:

【函数式编程】什么是函数式编程? C语言为何不是函数式语言?_多态_09

image.png

 

上面的做法和直接写语句有什么不同?

- (BOOL)canLoginUserName:(NSString *)username password:(NSString *)password{ if (username.length > 0 && password.length > 0) { }else{ }}

拆分方式不同,图中拆分成了:

​​username​​和它的关系​​length>0​​,得到结果​​YES​​ ​​password​​和它的关系​​length>0​​,得到结果​​YES​​ 两个​​YES​​和它的关系​​&&​​,得到结果​​YES​​

结论:

如果你把世界拆分成​​类​​,​​对象​​你就得到了​​面向对象​​。如果你把世界拆分成​​事物​​和​​事物之间的关系​​你就得到了​​函数式​​。

好了道友们,看到这里你可以怀着愉快的心情关上电脑,闭上眼睛,深呼吸,思考一下如何按照​​事物​​和​​事物之间的关系​​的方式来拆分世界,你就已经掌握了函数式编程的思想。

简单对比 ​​面向对象​​的世界里我们是把​​事物​​抽象成​​类​​和​​对象​​,然后通过​​封装​​、​​继承​​和​​多态​​来演示他们之间的关系。 ​​函数式​​的世界里把世界抽象成​​事物​​和​​事物之间的关系​​,用这种方式实现世界的模型。

面向对象的编程更有人情味一些更社会化。比如你想要买一辆汽车,想要托人帮忙砍价。恰好你同学的朋友的大表哥的二嫂子在4s店工作。你就需要:

import "同学"import "朋友"import "大表哥"import "二嫂子"

然后再调用​​二嫂子.砍价();​​

函数式编程则更“冰冷”一些,像是工厂里的流水线不停的运转,只要你放入材料就可以在出口处拿到产品。而且它对外部环境没有依赖,只需要将流水线搬走就可以在任何地方生产。不需要找同学的朋友的大表哥的二嫂子来帮忙了。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3